#ifndef WHEN_CALLED_H
#define WHEN_CALLED_H

////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T>
class WhenCalled
{
public:
    void willThrow();
};

template<typename T>
void WhenCalled<T>::willThrow()
{
}

////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T, typename TArg>
class WhenCalledArg : WhenCalled<T>
{
public:
    void withArgument(TArg value);
};

template<typename T, typename TArg>
void WhenCalledArg<T, TArg>::withArgument(TArg value)
{
}

////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T, typename TArg1, typename TArg2>
class WhenCalledArgs2 : WhenCalled<T>
{
public:
    void withArguments(TArg1 value1, TArg2 value2);
};

template<typename T, typename TArg1, typename TArg2>
void WhenCalledArgs2<T, TArg1, TArg2>::withArguments(TArg1 value1, TArg2 value2)
{
}

////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T, typename TArg1, typename TArg2, typename TArg3>
class WhenCalledArgs3 : WhenCalled<T>
{
public:
    void withArguments(TArg1 value1, TArg2 value2, TArg3 value3);
};

template<typename T, typename TArg1, typename TArg2, typename TArg3>
void WhenCalledArgs3<T, TArg1, TArg2, TArg3>::withArguments(TArg1 value1, TArg2 value2, TArg3 value3)
{
}

////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T, typename TArg1, typename TArg2, typename TArg3, typename TArg4>
class WhenCalledArgs4 : WhenCalled<T>
{
public:
    void withArguments(TArg1 value1, TArg2 value2, TArg3 value3, TArg4 value4);
};

template<typename T, typename TArg1, typename TArg2, typename TArg3, typename TArg4>
void WhenCalledArgs4<T, TArg1, TArg2, TArg3, TArg4>::withArguments(
    TArg1 value1, TArg2 value2, TArg3 value3, TArg4 value4)
{
}

////////////////////////////////////////////////////////////////////////////////////////////////////

#endif
